import numpy as np
import pylab

np.seterr(invalid='ignore')

d0=10
d00=1e-5
x0=0
y0=0
z0=0
step=100
step0=1e-5

def f(X): 
    return (X[0]-1)**2+(X[1]-10)**2+(X[2]-100)**2
    #print(f(0,1))  实际最小值解：x=0  y=1

    
def BAS(x0,y0,z0,d0,step):
    minvalue=10000000
    oldminvalue=minvalue
    dir=np.array([np.random.random(),np.random.random(),np.random.random()])
    dir=dir/np.linalg.norm(dir,ord=2) # 归一化
    x=np.array([x0,y0,z0])
    xl=x+d0*dir/2
    xr=x-d0*dir/2
    fl=f(xl)
    fr=f(xr)
    minvalue=(fl+fr)/2
    k=0
    while True:
        k+=1
        oldminvalue=minvalue
        x=x-step*dir*np.sign(fl-fr)
        dir=np.array([np.random.random(),np.random.random(),np.random.random()])
        dir=dir/np.linalg.norm(dir,ord=2) # 归一化
        xl=x+d0*dir/2
        xr=x-d0*dir/2
        fl=f(xl)
        fr=f(xr)
        minvalue=(fl+fr)/2
        step=step*0.96+step0
        d0=d0*0.96+d00

        if abs(oldminvalue-minvalue)<1e-5:
            break
        #print(x)
    print(k)
    return x
    
x=BAS(x0,y0,z0,d0,step)
print('最小值点坐标位置：',x,'最小值：',f(x))